/* 
  同步模式：JS执行环境中负责执行代码的线程只有一个
  异步模式：不会等待任务结束才开始下一个任务，开启过后就执行下个任务，后续逻辑通过回调函数执行
 
*/


/*  回调函数：调用者定义，执行者执行函数 */
function foo(fn) {
  setTimeout(fn, 3000)
}
// foo(function () {
//   console.log(12)
//   console.log(123)
//   console.log(1245)
// })


/* 
  Promise本身是同步的，他的then方法和catch方法是异步的
  Promise对象的then返回会返回一个全新的Promise对象
  后面的then方法就是为上一个then返回Promise注册回调
  前面then方法中回调函数返回值会作为后面then方法的参数
  如果回调中返回的是promise。后面的then返回会等待上一个promised的结果


  promise.all等待所有任务结束
  promise.race只要又一个任务结束
 */

const promise = new Promise((resolve, reject) => {
  resolve(123);
})

// promise.then(res => {
//   console.log(res)
// })

// console.log('end');




/* 用promise封装ajax */
function ajax(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('get', url, true); // 浏览器禁止第三个参数async设置为false
    xhr.onreadystatechange = function (e) {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(xhr.response)
        } else {
          reject(new Error('error'));
        }
      }
    }
    xhr.send();
  })
}

function ajax({
  method = 'get',
  url = ''
} = {}) {
  // const _default = {method: 'get'};
  // let config = Object.assign({}, _default, param);
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.responseType = 'json'
    xhr.onload = function () {
      if (this.status === 200) {
        resolve(this.response)
      } else {
        reject(new Error(this.statusText))
      }
    }
    xhr.open(method, url)
    xhr.send();
  })
}

// ajax({
//   url: 'api/list.json'
// }).then(res => {
//   console.log(res)
// })

// Promise.resolve(1).then(res => {
//   console.log(res);
//   Promise.resolve(2)
// }).then(res => {
//   console.log(res)
//   return Promise.resolve(3)
// }).then(res => {
//   console.log(res)
//   return Promise.resolve(4)
// }).then(res => {
//   console.log(res)
// })

console.log(0)
let promise1 = new Promise((resolve, reject) => {
  console.log("1")
  setTimeout(function () {
    resolve('2')
  }, 3000)
}).then(res => {
  console.log("3")
  console.log(res);
})
console.log(4)

/* new Promise((resolve) => {
  console.log('外层宏事件2');
  resolve()
}).then(() => {
  console.log('微事件1');
}).then(() => {
  console.log('微事件2')
})
console.log('外层宏事件1');
setTimeout(() => {
  //执行后 回调一个宏事件
  console.log('内层宏事件3')
}, 0)
 */

